package com.example.ziliao.utils

import kotlin.random.Random

object NumberGenerator {
    /**
     * 生成随机数，范围从3位数到6位数
     * @return 生成的随机数
     */
    fun generateRandomNumber(): Double {
        return when (Random.nextInt(4)) {
            0 -> Random.nextDouble(100.0, 999.9) // 3位数带小数
            1 -> Random.nextDouble(1000.0, 9999.0) // 4位数（整数）
            2 -> Random.nextDouble(10000.0, 99999.0) // 5位数（整数）
            else -> Random.nextDouble(100000.0, 999999.0) // 6位数（整数）
        }
    }

    /**
     * 格式化数字，根据大小决定是否保留小数
     * @param number 要格式化的数字
     * @return 格式化后的数字
     */
    fun formatNumber(number: Double): Double {
        return when {
            number < 1000 -> {
                // 小于1000的数随机显示一位或两位小数
                when (Random.nextInt(2)) {
                    0 -> String.format("%.1f", number).toDouble() // 一位小数
                    else -> String.format("%.2f", number).toDouble() // 两位小数
                }
            }
            else -> String.format("%.0f", number).toDouble() // 大于等于1000的数显示为整数
        }
    }

    /**
     * 生成一系列递增的随机数
     * @param count 需要生成的数字个数
     * @param minGrowth 最小增长率
     * @param maxGrowth 最大增长率
     * @return 生成的随机数列表
     */
    fun generateIncreasingNumbers(count: Int, minGrowth: Double = 0.6, maxGrowth: Double = 1.4): List<Double> {
        val numbers = mutableListOf<Double>()
        val firstNumber = generateRandomNumber()
        numbers.add(formatNumber(firstNumber))

        for (i in 1 until count) {
            val prevNumber = numbers[i - 1]
            val minValue = prevNumber * minGrowth
            val maxValue = prevNumber * maxGrowth
            val newNumber = Random.nextDouble(minValue, maxValue)
            numbers.add(formatNumber(newNumber))
        }

        return numbers
    }

    /**
     * 生成一系列递增的随机数，并确保相邻数相差不超过指定比例
     * @param count 需要生成的数字个数
     * @param minGrowth 最小增长率
     * @param maxGrowth 最大增长率
     * @return 生成的随机数列表
     */
    fun generateControlledNumbers(count: Int, minGrowth: Double = 0.6, maxGrowth: Double = 1.4): List<Double> {
        val numbers = mutableListOf<Double>()
        val displayNumbers = mutableListOf<Double>()
        
        // 生成第一个数
        val firstNumber = generateRandomNumber()
        numbers.add(firstNumber)
        displayNumbers.add(formatNumber(firstNumber))

        // 生成后续的数，确保相邻数相差不超过指定比例
        for (i in 1 until count) {
            val prevNumber = numbers[i - 1]
            val minValue = prevNumber * minGrowth
            val maxValue = prevNumber * maxGrowth
            val newNumber = Random.nextDouble(minValue, maxValue)
            numbers.add(newNumber)
            displayNumbers.add(formatNumber(newNumber))
        }

        // 处理特殊情况：如果总和恰好是100的倍数，给最后一个数加1
        val sum = displayNumbers.sum()
        if (sum % 100 == 0.0) {
            val lastIndex = displayNumbers.size - 1
            displayNumbers.set(lastIndex, displayNumbers[lastIndex] + 1)
        }

        return displayNumbers
    }

    /**
     * 格式化数字列表为显示文本，每行最多显示5个数字
     * @param numbers 要格式化的数字列表
     * @return 格式化后的显示文本
     */
    fun formatDisplayText(numbers: List<Double>): String {
        val displayText = StringBuilder()
        numbers.forEachIndexed { index, number ->
            val formattedNumber = when {
                number < 1000 -> {
                    // 小于1000的数随机显示一位或两位小数
                    when (Random.nextInt(2)) {
                        0 -> String.format("%.1f", number) // 一位小数
                        else -> String.format("%.2f", number) // 两位小数
                    }
                }
                else -> String.format("%.0f", number) // 大于等于1000的数显示为整数
            }
            
            displayText.append(formattedNumber)
            if (index < numbers.size - 1) {
                if ((index + 1) % 5 == 0) {
                    displayText.append("\n")
                } else {
                    displayText.append("    ")
                }
            }
        }
        return displayText.toString()
    }
} 